#include "Calls.h"
#include <iostream>
#include <vector>

using namespace std;

typedef int INTEGER;
typedef int INDEX;
typedef string STRING;


Calls::Calls(){
	_size= 0;
	_table = vector<Triple>();
}
BOOLEAN Calls::setCall(INDEX procLine, INDEX pro1, INDEX pro2){
	Triple t = Triple(procLine,pro1,pro2);
	_table.push_back(t);
	_size++;
	return true;
}
vector<Triple> Calls::getCalls(){
	return _table;
}
INDEX Calls::getCallSize(){
	return _size;
}
vector<INDEX> Calls::getCallee(INDEX pro1){  // first -> second
	vector<INDEX> result = vector<int>();
	for(int i=0;i<_size;i++){
		if(_table.at(i).getSecond()==pro1){
			result.push_back(_table.at(i).getThird());
		}
	}
	return result;
}
vector<INDEX> Calls::getCaller(INDEX pro2){ // second -> first
	vector<INDEX> result = vector<int>();
	for(int i=0;i<_size;i++){
		if(_table.at(i).getThird()==pro2){
			result.push_back(_table.at(i).getSecond());
		}
	}
	return result;
}

INDEX Calls::getCallerFromLineNum(INDEX procLine) {
	for (int i=0; i<_size; i++) {
		if (_table.at(i).getFirst()==procLine) {
			return _table.at(i).getSecond();
		}
	}
	return -1;
}

INDEX Calls::getCalleeFromLineNum(INDEX procLine){
	for (int i=0; i<_size; i++) {
		if (_table.at(i).getFirst()==procLine) {
			return _table.at(i).getThird();
		}
	}
	return -1;
}

BOOLEAN Calls::isCall(INDEX pro1,INDEX pro2){
	vector<INDEX> temp = getCallee(pro1);
	for (int i=0; i<temp.size(); i++) {
		if (temp.at(i) == pro2) return true;
	}
	return false;
}

BOOLEAN Calls::isCallStatement(INDEX procLine){
	for (int i=0; i<_size;i++) {
		if (_table.at(i).getFirst()==procLine) {
			return true;
		}
	}
	return false;
}

vector<INDEX> Calls::getLineNum(INDEX proc1){
	vector<INDEX> result = vector<int>();
	for(int i=0;i<_size;i++){
		if(_table.at(i).getSecond()==proc1){
			result.push_back(_table.at(i).getFirst());
		}
	}
	return result;
}












